import { ref, onActivated, onDeactivated, reactive } from "vue";
import ajax from "@/util/request";
import config from "@/util/config";

import permision from "@/NERtcUniappSDK-JS/permission.js";
import NERTC from "@/NERtcUniappSDK-JS/lib/index";

import {
	NERTCLogLevel,
	NERTCRenderMode,
	NERTCMirrorMode,
	NERtcVideoStreamType,
	NERtcVideoFrameRate,
	NERtcVideoCropMode,
	NERtcDegradationPreference,
	NERtcVideoOutputOrientationMode,
	NERtcVideoProfileType,
	NERtcRemoteVideoStreamType,
	NERTCAudioDevice,
	NERTCAudioDeviceType,
	NERTCAudioDeviceState,
	NERTCVideoDeviceState,
	NERTCConnectionType,
	NERTCErrorCode,
	NERtcAudioVolumeInfo,
	NERTCAudioProfile,
	NERTCAudioScenario,
	NERTCChannelProfile,
	NERTCUserRole,
	NERtcSubStreamContentPrefer
} from '@/NERtcUniappSDK-JS/lib/NERtcDefines';

/**
 * 初始化
 * @param subscribeRemoteVideo: 是否订阅远程视频 
 * @returns 
 */
const setup = ({ subscribeRemoteVideo = false } : { subscribeRemoteVideo : boolean } = { subscribeRemoteVideo: false }) => {

	// console.log("setup一次")

	const joinChannel = ref(false);
	const token = ref("");
	const logs = reactive<string[]>([]);

	interface IUserListData {
		t_admin_pk : number,
		remoteStream ?: any,
		disableAudio ?: boolean,
	}

	// 加入房间的远端用户id
	const userListData = reactive<IUserListData[]>([]);

	// 是否发送本地声音（通过开关麦克风实现）
	const localAudio = ref(true);

	// 是否发送本地视频（通过开关麦克风实现）
	const localVideo = ref(true);

	// 是否接收远端声音（通过开关远端声音流实现）
	// const recordDeviceMute = ref(true);

	const engine = NERTC.setupEngineWithContext({
		appKey: config.appkey,
		logDir: '', // expected log directory
		logLevel: 3
	});


	// 判断权限
	if (uni.getSystemInfoSync().platform === "android") {
		permision.requestAndroidPermission(
			"android.permission.RECORD_AUDIO"
		);
		permision.requestAndroidPermission(
			"android.permission.CAMERA"
		);
	}

	const userID = uni.getStorageSync("userID");

	/**
	 * bool：true为加入房间，false为离开房间
	 * channelName：房间名称
	 */
	const setJoinChannel = (bol : boolean, channelName = "uniapp") => {
		// 加入房间
		if (bol) {
			// 异步请求token
			ajax({
				url: "/resource/getRTCToken",
				method: "POST",
				data: { uid: userID },
			}).then((res : any) => {
				console.log("res = ", res);
				if (res.data.code >= 1 && res.data.data.code == 200) {

					token.value = res.data.data.token;

					// 加入房间
					engine.joinChannel({
						//如果云信业务后台开启了安全模式，需要填写token
						token: token.value,
						//自定义房间名称
						channelName,
						//该房间中个人userID自定义标识，要求number类型（不要超出number范围），房间中唯一
						myUid: userID
					});
					// console.log(`我（${userID}）加入房间：${channelName}`);
					// 注册事件
					addEventListener();
				}
			})
		} else {
			engine.leaveChannel();
			// console.log(`${userID}离开房间。`);
		}
	};

	/**
	 * 初始化本地流：主要用于设置是否发布自己的视频
	 */
	const initLocalStream = async (subscribeLocalVideo ?: boolean) => {
		if (subscribeLocalVideo) {
			// 本地视频配置
			const videoConfig = {
				videoStreamType: NERtcVideoStreamType.MAIN, // 表示是对视频主流的配置
				maxProfile: NERtcVideoProfileType.Standard, //不推荐使用了
				frameRate: NERtcVideoFrameRate.FRAME_RATE_FPS_24, //设置帧率24
				minFrameRate: NERtcVideoFrameRate.FRAME_RATE_FPS_15, //设置最小帧率15
				bitrate: 2000, //设置视频码率1500kbps
				minBitrate: 1000, //设置视频码率最小为1000kbps
				width: 640, //设置视频宽为1280
				height: 360, //设置视频高为720
				//视频采集宽高比为16:9
				cropMode: NERtcVideoCropMode.CROP_16x9,
				//带宽受限时的视频编码降级偏好为默认
				degradationPreference: NERtcDegradationPreference.DEGRADATION_DEFAULT,
				//AUTO表示使用默认值
				mirrorMode: NERTCMirrorMode.AUTO,
				//（默认）该模式下 SDK 输出的视频方向与采集到的视频方向一致。接收端会根据收到的视频旋转信息对视频进行旋转
				orientationMode: NERtcVideoOutputOrientationMode.VIDEO_OUTPUT_ORIENTATION_MODE_ADAPTATIVE
			}
			engine.setLocalVideoConfig(videoConfig);
			engine.setupLocalVideoCanvas({
				// 0表示使用视频，视频等比缩放，1表示适应区域，会裁剪，2：折中方案 //当前demo先使用数字，正式版本会是枚举
				renderMode: 0,
				//1表示启用镜像，2表示不启用
				mirrorMode: 1,
				//表示小画布置于大画布上面
				isMediaOverlay: false
			});
			engine.enableLocalVideo({
				//true表示设置启动摄像头，false表示关闭摄像头
				enable: true,
				//0表示视频，1表示屏幕共享 //当前demo先使用数字，正式版本会是枚举
				videoStreamType: 0
			});
			logs.unshift('开始传输本音视频信息。')
		} else {
			logs.unshift('开始传输本音频信息。')
		}
	}

	/**
	 * 添加侦听器
	 */
	const addEventListener = () => {

		// 自己加入房间成功
		engine.addEventListener("onJoinChannel", (result, channelId, elapsed, userID) => {
			if (joinChannel.value) {
				return;
			}
			logs.unshift(`我${userID}加入房间：${channelId}`);
			console.log("我${userID}加入房间：", channelId)

			const audioProfileConfig = {
				profile: NERTCAudioProfile.STANDARD, //设置profile为标准模式
				scenario: NERTCAudioScenario.SPEECH,//scenario为语音场景
			}

			//加入房间后设置音频profile
			engine.setAudioProfile(audioProfileConfig)

			//设置采集音量
			engine.adjustRecordingSignalVolume(100)
			joinChannel.value = true;
		});

		// 自己离开房间
		engine.addEventListener("onLeaveChannel", (result) => {
			console.log("我离开房间");
			logs.unshift("你已经离开房间");
			joinChannel.value = false;
		});

		// 侦听有远端用户加入房间
		engine.addEventListener('onUserJoined', (userID : any) => {
			if (userListData.findIndex(v => v.t_admin_pk == userID) == -1) {
				userListData.push({ t_admin_pk: userID });
				logs.unshift(`${userID}加入房间`);
				console.log(`${userID}加入房间`)
			}
		})

		// 侦听有远端用户离开房间
		engine.addEventListener('onUserLeave', (userID : any) => {
			console.log("有人加入房间！！！");
			const index = userListData.findIndex(v => v.t_admin_pk == userID);
			if (index >= 0) {
				userListData.splice(index, 1);
				logs.unshift(`“${userID}”离开房间`);
			}
		})

		// 判断是否需要远端视频（主要针对管理员1对1聊天的情况）
		if (subscribeRemoteVideo) {

			// 拉取流信息
			const subscribeRemoteVideo = async (remoteUserID : any) => {

				// 远端视频画布配置信息
				const remoteVideoCanvasConfig = {
					renderMode: NERTCRenderMode.Fit, // Fit表示应区域。视频尺寸等比缩放,保证所有区域被填满,视频超出部分会被裁剪
					mirrorMode: NERTCMirrorMode.AUTO, //AUTO表示使用默认值,由sdk控制
					isMediaOverlay: false, //表示小画布置于大画布上面
					userID: remoteUserID
				}
				console.log('setupRemoteVideoCanvas config: ', JSON.stringify(remoteVideoCanvasConfig))
				try {
					await engine.setupRemoteVideoCanvas(remoteVideoCanvasConfig);
					engine.subscribeRemoteVideo({
						userID: remoteUserID,
						streamType: 0, //0表示大流，1表示小流
						subscribe: true //true表示订阅，false表示取消订阅
					});
					logs.unshift(`开始播放管理端的视频画布`);
				} catch (e) {
					console.error(e);
					logs.unshift(`播放管理端的视频出错`);
				}
			}

			// 对方播放视频：主要用于与管理员1对1时
			engine.addEventListener("onUserVideoStart", (userID, maxProfile) => {
				// console.log('onUserVideoStart userID: ', userID)
				// const message = `onUserVideoStart通知：对方开启视频，userID = ${userID}, maxProfile = ${maxProfile}`
				console.log("侦听到管理端的视频信息");
				logs.unshift("侦听到管理端的视频信息");
				//需要开发者主动去做订阅对方视频的逻辑动作
				subscribeRemoteVideo(userID)
			});

			engine.addEventListener("onUserVideoStop", (userID) => {
				console.log("管理端的关闭视频信号");
				logs.unshift("管理端的关闭视频信号");
				//对端关闭视频，建议主动调用接口释放对端视频画布相关的资源
				engine.destroyRemoteVideoCanvas({
					userID
				})
			});
		}
	}

	/**
	 * 设置是否播放远端用户的音频信息
	 */
	const setRemoteAudio = ({ userID, bool } : { userID : number, bool : boolean }) => {
		const user = userListData.find(v => v.t_admin_pk == userID);
		if (!user) {
			return;
		}
		const remoteStream = user.remoteStream;
		if (!remoteStream) {
			console.log("请检测是否是测试数据，没有remoteStream。")
			return;
		}
		engine.subscribeRemoteVideo({
			userID,
			streamType: 0, //0表示大流，1表示小流
			subscribe: bool //true表示订阅，false表示取消订阅
		});
	}

	/**
	 * 切换摄像头
	 */
	const switchCamera = () => {
		engine.switchCamera();
	}

	return {
		localAudio,
		localVideo,
		joinChannel,
		setJoinChannel,
		setRemoteAudio,
		token,
		logs,
		userListData,
		initLocalStream,
		switchCamera
	}
}


// const setRecordDeviceMute = () => {
//     recordDeviceMute.value = !recordDeviceMute.value;
//     if (muteLocalAudio.value) {
//         localStream.close({ type: "video" });
//     } else {
//         localStream.open({ type: "video" });
//     }
//     client.setRecordDeviceMute(recordDeviceMute.value);
// }



export default setup;